package hacky.filebased.agent;

import java.io.Closeable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;

public class FileUtilities {
    public static byte[] readFileFully(File fileWritten) {
        RandomAccessFile randomAccessFile = null;

        try {
            randomAccessFile = new RandomAccessFile(fileWritten, "r");
            int length = (int) randomAccessFile.length();
            byte[] fullClassFile = new byte[length];
            randomAccessFile.readFully(fullClassFile);
            return fullClassFile;
        } catch (Exception e) {
            e.printStackTrace(System.err);
            return null;
        } finally {
            closeIgnoringIoException(randomAccessFile);
        }
    }

    public static File writeClassFile(File tempDirectory, String fullyQualifiedClassName,
            byte[] classfileBuffer) throws FileNotFoundException, IOException {
        String className = fullyQualifiedClassName.replaceAll(".*/", "");
        File classFile = new File(tempDirectory, className + ".class");
        writeBytesToFile(classfileBuffer, classFile);
        return classFile;
    }

    public static void writeBytesToFile(byte[] classfileBuffer, File classFile)
            throws FileNotFoundException, IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(classFile);
        fileOutputStream.write(classfileBuffer);
        fileOutputStream.close();
    }

    public static File createTemporaryDirectory(String name) throws IOException {
        File tempDirectory = new File(name);

        if (tempDirectory.exists() && tempDirectory.isDirectory())
            clearAllFiles(tempDirectory);

        if (tempDirectory.exists())
            tempDirectory.delete();

        tempDirectory.mkdir();

        return tempDirectory;
    }

    public static void clearAllFiles(File directory) {
        String[] files = directory.list();
        for (String currentFile : files)
            new File(currentFile).delete();
    }

    private static void closeIgnoringIoException(Closeable closeable) {
        try {
            if (closeable != null)
                closeable.close();
        } catch (IOException ignore) {
        }
    }
}
